package xianchenglock1;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @功能
 * @创建时间 2019/12/18
 * 这里使用wait和notify识别，wait会释放锁，notify不会释放锁
 * 需要注意的是，运用这种方法，必须保证t2先执行，也就是首先让t2监听才可以
 *
 * 可以读到输出结果并不是size=5时t2退出，而是t3结束时t2才收到通知而退出。。。？
 */
public class MyContainer3 {
    //添加v。。。 使t2能得到通知
    volatile List lists = new ArrayList();
    public void add(Object o){
        lists.add(o);
    }
    public int size(){
        return lists.size();
    }

    public static void main(String[] args) {
        MyContainer3 c = new MyContainer3();
        final Object lock = new Object();
        new Thread(()->{
           synchronized (lock){
               System.out.println("t2启动");
               if(c.size()!=5){
                   try{
                       lock.wait(); // 释放锁，进入等待
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   lock.notify(); //让t1执行
           System.out.println("T2 结束");
               }
           }
        },"t2").start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            System.out.println("t1启动");
            synchronized (lock){
                for(int i=0;i<10;i++){
                    c.add(new Object());
                    System.out.println("add"+i);
                    if(c.size() == 5){
                        lock.notify();  // 叫醒t2线程，但不会释放锁
                        try{
                            lock.wait(); // 释放锁，t2执行
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    try{
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("t1结束");
        }).start();
    }
}
